#!/usr/local/bin/python
# 31-08-04
#v1.0.0 

# cookie_example.py
# An example showing the usage of cookielib (New to Python 2.4) and ClientCookie

# Copyright Michael Foord
# You are free to modify, use and relicense this code.
# No warranty express or implied for the accuracy, fitness to purpose or otherwise for this code....
# Use at your own risk !!!

# If you have any bug reports, questions or suggestions please contact me.
# If you would like to be notified of bugfixes/updates then please contact me and I'll add you to my mailing list.
# E-mail michael AT foord DOT me DOT uk
# Maintained at www.voidspace.org.uk/atlantibots/pythonutils.html

COOKIEFILE = 'cookies.lwp'          # the path and filename that you want to use to save your cookies in
import os.path

cj = None
ClientCookie = None
cookielib = None

try:                                    # Let's see if cookielib is available
	import cookielib            
except ImportError:
	pass
else:
	import urllib2    
	urlopen = urllib2.urlopen
	cj = cookielib.LWPCookieJar()       # This is a subclass of FileCookieJar that has useful load and save methods
	Request = urllib2.Request

if not cookielib:                   # If importing cookielib fails let's try ClientCookie
	try:                                            
		import ClientCookie 
	except ImportError:
		import urllib2
		urlopen = urllib2.urlopen
		Request = urllib2.Request
	else:
		urlopen = ClientCookie.urlopen
		cj = ClientCookie.LWPCookieJar()
		Request = ClientCookie.Request

####################################################
# We've now imported the relevant library - whichever library is being used urlopen is bound to the right function for retrieving URLs
# Request is bound to the right function for creating Request objects
# Let's load the cookies, if they exist. 

if cj != None: # now we have to install our CookieJar so that it is used as the default CookieProcessor in the default opener handler
	if os.path.isfile(COOKIEFILE):
		cj.load(COOKIEFILE)
	if cookielib:
		opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
		urllib2.install_opener(opener)
	else:
		opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cj))
		ClientCookie.install_opener(opener)

# If one of the cookie libraries is available, any call to urlopen will handle cookies using the CookieJar instance we've created
# (Note that if we are using ClientCookie we haven't explicitly imported urllib2)
# as an example :

theurl = 'http://www.google.com'  # an example url that sets a cookie, try different urls here and see the cookie collection you can make !
txdata = None                     # if we were making a POST type request, we could encode a dictionary of values here - using urllib.urlencode
txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}  # fake a user agent, some websites (like google) don't like automated exploration

try:
	req = Request(theurl, txdata, txheaders)            # create a request object
	handle = urlopen(req)                               # and open it to return a handle on the url
except IOError, e:
	print 'We failed to open "%s".' % theurl
	if hasattr(e, 'code'):
		print 'We failed with error code - %s.' % e.code
else:
	print 'Here are the headers of the page :'
	print handle.info()                             # handle.read() returns the page, handle.geturl() returns the true url of the page fetched (in case urlopen has followed any redirects, which it sometimes does)

print
if cj == None:
	print "We don't have a cookie library available - sorry."
	print "I can't show you any cookies."
else:
	print 'These are the cookies we have received so far :'
	for index, cookie in enumerate(cj):
		print index, '  :  ', cookie        
	cj.save(COOKIEFILE)                     # save the cookies again



